package ar.uba.fi.algo3.tp3.modelo;

import ar.uba.fi.algo3.titiritero.Posicionable;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class Mapa implements Posicionable, Serializable {

	private List<Fantasma> listaFantasmas;
    private List<Pastilla> listaPastillas;
    private List<Pared> listaParedes;
    private List<Fruta> listaFrutas;
    private CasaFantasmas casaFantasmas;
    private CasaPacman casaPacman;
    private Pacman pacman;
    private int nivel;

    public Mapa() {
        this.listaFantasmas = new ArrayList<Fantasma>();
        this.listaParedes = new ArrayList<Pared>();
        this.listaPastillas = new ArrayList<Pastilla>();
        this.listaFrutas = new ArrayList<Fruta>();
    }

    public void inicializarMapa(int nivel) {
        ScannerMapa scanner = new ScannerMapa(nivel);
        scanner.cargarMapa(this);
        this.nivel = nivel;
    }
    
    public int getX() {
        return 0;
    }

    public int getY() {
        return 0;
    }

    public void agregarPared(int x, int y) {
        Pared pared = new Pared(x, y);
        listaParedes.add(pared);
    }

    public void agregarPastilla(int x, int y) {
        Pastilla p = new PastillaComun(x, y);
        listaPastillas.add(p);
    }

    public void agregarPastillaPower(int x, int y) {
        Pastilla p = new PastillaPower(x, y);
        listaPastillas.add(p);
    }
    
    
    public void agregarFruta(Fruta f){
    	listaFrutas.add(f);
    }

    public void agregarFantasma(Fantasma f) {
        listaFantasmas.add(f);
    }
    

    public Pastilla hayPastillas(int x, int y) {
        Pastilla retorno = null;
        for (Iterator<Pastilla> it = listaPastillas.iterator(); it.hasNext();) {
            Pastilla pastilla = it.next();
            if (estaEnRango(x, y, pastilla)) {
                retorno = pastilla;
            }
        }
        return retorno;
    }

    public List<Pared> getListaParedes() {
        return this.listaParedes;
    }

    public List<Pastilla> getListaPastillas() {
        return this.listaPastillas;
    }
    
    public List<Fantasma> getListaFantasmas() {
    	return this.listaFantasmas;
    }
    
    public List<Fruta> getListaFrutas(){
    	return this.listaFrutas;
    }
    
    public List<Fruta> hayFrutas(int x, int y){
    	List<Fruta> retorno = new ArrayList<Fruta>();
    	for(Iterator<Fruta> it = listaFrutas.iterator(); it.hasNext();) {
    		Fruta fruta = it.next();
    		if(estaEnRango(x,y,fruta)){
    			retorno.add(fruta);
    		}
    	}
    	return retorno;
    }

    public void establecerPacman(Pacman p) {
        this.pacman = p;
    }

    public List<Fantasma> hayFantasmas(int x, int y) {
        List<Fantasma> retorno = new ArrayList<Fantasma>();
        for (Iterator<Fantasma> it = listaFantasmas.iterator(); it.hasNext();) {
            Fantasma fantasma = it.next();
            if (estaEnRango(x, y, fantasma)) {
                retorno.add(fantasma);
            }
        }
        return retorno;
    }

    public Pacman hayPacman(int x, int y) {
        if (estaEnRango(x, y, pacman)) {
            return pacman;
        }
        return null;
    }

    private boolean estaEnRango(int x, int y, Posicionable p) {
        int difX = Math.abs(p.getX() - x);
        int difY = Math.abs(p.getY() - y);
        return ((difX < 15) && difY < 15);
    }

    public boolean sePuedeIrA(int x, int y, Direccion d, int velocidad) {
        int incrementoX = 0;
        int incrementoY = 0;

        if (d == Direccion.ABAJO) {
            incrementoY = velocidad;
        }
        if (d == Direccion.ARRIBA) {
            incrementoY = -velocidad;
        }
        if (d == Direccion.IZQUIERDA) {
            incrementoX = -velocidad;
        }
        if (d == Direccion.DERECHA) {
            incrementoX = velocidad;
        }

        int xDestino = x + incrementoX;
        int yDestino = y + incrementoY;

        for (Iterator<Pared> it = listaParedes.iterator(); it.hasNext();) {
            Pared pared = it.next();
            if (xDestino > (pared.getX() - 30) && xDestino < (pared.getX() + 30) &&
                    yDestino > (pared.getY() - 30) && yDestino < (pared.getY() + 30)) {
                return false;
            }
        }
        return true;
    }

    public boolean hayPared(int x, int y) {
        for (Iterator<Pared> it = listaParedes.iterator(); it.hasNext();) {
            Pared pared = it.next();
            if (x == pared.getX() && y == pared.getY()) {
                return true;
            }
        }
        return false;
    }

    public void quitarPastilla(Pastilla p) {
        listaPastillas.remove(p);
    }
    
    public void quitarFruta(Fruta f){
    	listaFrutas.remove(f);
    }

    public void hacerMortalesALosFantasmas() {
        for (Iterator<Fantasma> it = listaFantasmas.iterator(); it.hasNext();) {
            Fantasma fantasma = it.next();
            fantasma.setMortal(true);
        }
        Partida.getInstance().resetearCuentaFantasmasComidos();
    }

    public Pacman getPacman() {
        return this.pacman;
    }

    public void establecerCasaFantasmas(int x, int y) {
        this.casaFantasmas = new CasaFantasmas(x, y);
    }

    public void establecerCasaPacman(int x, int y) {
        this.casaPacman = new CasaPacman(x, y);
    }

    public CasaFantasmas getCasaFantasmas() {
        return this.casaFantasmas;
    }

    public CasaPacman getCasaPacman() {
        return this.casaPacman;
    }

    public int getNivel() {
        return this.nivel;
    }

}
